package com.info.zhiduoduo.core.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.google.common.collect.Lists;
import com.info.zhiduoduo.common.constants.SmartResult;
import com.info.zhiduoduo.common.exception.SmartException;
import com.info.zhiduoduo.common.validator.ExcelImportValid;
import lombok.Getter;

import java.util.List;

/**
 * @author tianyonghong
 * @create 2022/8/9
 */
@Getter
public class BaseAnalysisEventListener<T> extends AnalysisEventListener<T> {

    // 返回数据
    public SmartResult smartResult;
    // 当前所在行
    public int index;
    // 错误数据合集
    public List<String> errorPrompt = Lists.newArrayList();

    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        index = analysisContext.readRowHolder().getRowIndex() + 1;
        // 通用方法基础数据校验
        ExcelImportValid.valid(index, t);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }

    /**
     * 数据转换异常 获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) {
        // 解析失败，继续解析下一行 如果是某一个单元格的转换异常 能获取到具体行号
        // 如果要获取头的信息 配合invokeHeadMap使用
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException ex = (ExcelDataConvertException) exception;
            if (ex.getMessage().contains("Convert")) {
                errorPrompt.add("请检查第[" + (ex.getRowIndex() + 1) + "]行，第[" + (ex.getColumnIndex() + 1) + "]列数据格式错误：" + ex.getCellData());
            } else {
                errorPrompt.add("请检查第[" + index + "]行数据：" + ex.getMessage());
            }
        } else if (exception instanceof NullPointerException) {
            throw new SmartException("导入模板有误，请重新下载模板！");
        } else if (exception instanceof ExcelAnalysisException) {
            throw new ExcelAnalysisException(exception.getMessage());
        } else {
            throw new SmartException("解析出错停止运行：" + exception.getMessage());
        }
    }

}
